from langchain.agents import Tool, AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from core.tool_1_天气查询 import get_weather
from core.tool_2_时间查询 import get_current_time
from core.tool_3_联网搜索 import web_search
from core.tool_4_旅游助手 import kayak_pro
from core.tool_5_文旅文案 import tourism_text
from config.settings import settings

# 注册工具
tools = [
    Tool(
        name="weather check",
        func=get_weather,
        description="获取指定城市的实时天气信息，输入必须是城市名称（如：'杭州'）",
    ),
    Tool(
        name="current time",
        func=get_current_time,
        description="获取当前的时间，无需输入参数",
    ),
    Tool(
        name="web serch",
        func=web_search,
        description="网络搜索，输入的是需要搜索的问题",
    ),    
    Tool(
        name="kayak pro",
        func=kayak_pro,
        description="当捕获到用户有想出去玩/旅游的时候，调用工作流指定旅游计划，输入为用户输入",
    ),
    Tool(
        name="tourism text",
        func=tourism_text,
        description="当捕获到著名景点名称的时候，调用工作流生成文旅文案，输入为用户输入",
    ),
]

# 准备大模型
llm = ChatOpenAI(
    base_url=settings.LLM_BASE_URL,  # 使用配置文件中的URL
    openai_api_key=settings.LLM_API_KEY,  # 使用配置文件中的API密钥
    model=settings.LLM_DEFAULT_MODEL,  # 使用配置文件中的模型
)

# 准备提示词模板
template = """
你是一个智能助手，可以通过调用工具回答用户问题。
工具列表：
{tools}

使用格式：
Question: 用户问题
Though: 分析是否需要工具，需要则使用工具
Action: 工具名称（必须是[{tool_names}]之一）
Action Input: 工具输入参数
Observation: 工具返回结果
...(此过程可以重复)
Thought: 已获取足够信息
Final Answer: 最终回答

开始!
Question: {input}
Thought: {agent_scratchpad}
"""

prompt = PromptTemplate.from_template(template)

# 创建 React-Agent
agent = create_react_agent(
    llm=llm,
    tools=tools,
    prompt=prompt,
    stop_sequence=["\nObservation"]
)

# 初始化Agent执行器
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,
    tools=tools,
    verbose=True
)

def get_agent_response(query: str, history: list = None) -> str:
    """
    调用智能体获取响应（支持历史对话）
    :param query: 当前查询
    :param history: 历史对话列表，格式为[{"role": "user/assistant", "content": "..."}]
    :return: 智能体的回答
    """
    # 如果有历史对话，拼接成上下文
    full_query = query
    if history and len(history) > 0:
        context = "\n".join([f"{item['role']}: {item['content']}" for item in history])
        full_query = f"历史对话：\n{context}\n当前问题：{query}"
    
    # 调用智能体
    ret = agent_executor.invoke({"input": full_query})
    return ret["output"]
    